package com.jgzx.service.impl;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import java.util.List;

/**
 * @author libo
 * @date 2021/4/7 16:03
 */
public abstract class AbstractServiceImpl<M extends BaseMapper<T>, T, R> extends ServiceImpl<M, T> {

    /**
     * 当前对象主键名称
     */
    private String keyProperty = null;

    /**
     * 批量保存明细记录【新增、修改、删除（不需要传入修改对象）】
     * 例：saveBatchByDetail(bomDetailPOs, BomDetailPO::getBom_manage_id, listDTO.getBom_manage_id() ,true)
     * @param entityList 可保存的集合对象【请使用PO】
     * @param column 指向主表字段
     * @param value 指向主表字段值
     * @param isEnableEnterprise 是否启用企业条件
     */
    public boolean saveBatchByDetail(List<T> entityList, R column, Long value, boolean isEnableEnterprise) {
        return saveBatchByDetail(entityList, columnToString(column), value, isEnableEnterprise, DEFAULT_BATCH_SIZE);
    }

    /**
     * 批量保存明细记录【新增、修改、删除（不需要传入修改对象）】
     * 例：saveBatchByDetail(bomDetailPOs, BomDetailPO::getBom_manage_id, listDTO.getBom_manage_id() ,true)
     * @param entityList 可保存的集合对象【请使用PO】
     * @param column 指向主表字段
     * @param value 指向主表字段值
     * @param isEnableEnterprise 是否启用企业条件
     * @param batchSize  批次大小
     */
    public boolean saveBatchByDetail(List<T> entityList, R column, Long value, boolean isEnableEnterprise, int batchSize) {
        return saveBatchByDetail(entityList, columnToString(column), value, isEnableEnterprise, batchSize);
    }

    /**
     * 构建带删除记录的数据集合【deleted】
     * hidField只使用第一条记录的值
     *  hidField为空：【不做删除操作，只处理保存和更新】
     *  hidField不为空：查询当前表hidField值为第一条记录的值的所有记录，和entityList做对比，不存在的就删除
     * @param entityList 可保存的集合对象【请使用PO】
     * @param column 指向主表字段
     * @param value 指向主表字段值
     * @param isEnableEnterprise 是否启用企业条件
     */
    public List<Long> getDelDetailId(List<T> entityList, R column, Long value,boolean isEnableEnterprise) {
       return getDelDetailId(entityList, columnToString(column), value, isEnableEnterprise);
    }

    /**
     * 构建带删除记录的数据集合【deleted】
     * hidField只使用第一条记录的值
     *  hidField为空：【不做删除操作，只处理保存和更新】
     *  hidField不为空：查询当前表hidField值为第一条记录的值的所有记录，和entityList做对比，不存在的就删除
     * @param entityList 可保存的集合对象【请使用PO】
     * @param column 指向主表字段
     * @param value 指向主表字段值
     * @param isEnableEnterprise 是否启用企业条件
     */
    public List<T> getDelDetailList(List<T> entityList, R column, Long value,boolean isEnableEnterprise) {
        return getDelDetailList(entityList, columnToString(column), value, isEnableEnterprise);
    }

    protected abstract boolean saveBatchByDetail(List<T> entityList, String hidField, Long hid, boolean isEnableEnterprise, int batchSize);

    protected abstract List<Long> getDelDetailId(List<T> entityList, String hidField, Long hid, boolean isEnableEnterprise);

    protected abstract List<T> getDelDetailList(List<T> entityList, String hidField, Long hid, boolean isEnableEnterprise);

    /**
     * 获取字段名称
     */
    protected String columnToString(R column) {
        return (String) column;
    }
    /**
     * 获取主键字段名
     */
    public String getKeyProperty(){
        if (keyProperty == null) {
            // 获取实体的表名、字段列
            TableInfo tableInfo = TableInfoHelper.getTableInfo(entityClass);
            // 字段主键字段名
            keyProperty = tableInfo.getKeyProperty();
        }
        return keyProperty;
    }
}
